package kgame5.k3d.core.render.layerrender.impl {
import kgame5.k3d.core.obj3d.info.geometry.Face3D;
import kgame5.k3d.core.obj3d.info.geometry.GeometryInfo;
import kgame5.k3d.core.obj3d.info.geometry.Line3D;
import kgame5.k3d.core.obj3d.info.material.MaterialInfo;
import kgame5.k3d.core.obj3d.info.transform.TransformInfo;
import kgame5.k3d.core.render.RenderSessionData;
import kgame5.k3d.core.render.layerrender.LayerRender;

import flash.display.Shape;

/**
 * @author kangkai
 */
public class Mesh3DLayerRender extends LayerRender{
	public function Mesh3DLayerRender(){
		mc=new Shape();
		g=(mc as Shape).graphics;
	}
	//显示一个Mesh,!!这个可是很核心的逻辑哦
	override public function render(gi:GeometryInfo,mi:MaterialInfo,ti:TransformInfo,session:RenderSessionData):void{
		
		session.stati.renderMeshCount++;//统计render方法被执行了多少次
		session.stati.faceCount += gi.aFace.length;
		//--!!重要的机制
		//在这里最终设置是否显示，很重要的设置，保证每次
		//md.setVisible之后都是在计算出新的位置之后才显示的，否则会显示错误的位置
		mc.visible=true;
		
		if(aOuterFace!=null){//三角面要融合,BestGroup3D
			//2,把待渲染的三角面都提取出来
			doAddToRenderList(gi.aFace,aOuterFace);
			return;
		}else{//不需要融合,独立绘制此图层
		
			//2,把待渲染的三角面提取出来
			var aSortedFace:Array=new Array();
			doAddToRenderList(gi.aFace,aSortedFace);
		
			//3,进行面排序，保证正确的遮罩效果
			doSort(aSortedFace);
			
			//4,绘制.传送一次贴图
			doFastDraw(mi,aSortedFace, gi.aLine,session);
		}
	}
	
	//判断并添加到待渲染的列表中。
	private function doAddToRenderList(aFace:Vector.<Face3D>,aRenderList:Array):void{
		//var st2:int=getTimer();
		for each(var face:Face3D in aFace){
			var canCull:Boolean=face.update();
			if(canCull==false){
				aRenderList.push(face);
			}
		}
		//session.stati.faceUpdateTime += getTimer()-st2;
	}
	
	//真正画到屏幕上,传送一次贴图
	private function doFastDraw(mi:MaterialInfo,aSortedFace:Array,aLine:Vector.<Line3D>,session:RenderSessionData):void{
		//逐个画三角面,注意是只画出需要画的
		//var st4:int=getTimer();
		g.clear();//很重要的地方，画新的一定要注意清除
		
		//画face
		g.beginBitmapFill(mi.bmd);
			
		for each(var face:Face3D in aSortedFace){
			face.drawFastBmd(g);
		}
		
		g.endFill();
		
		//画线,这个只是测试用的
		if(aLine!=null){
			for each(var line:Line3D in aLine){
				line.draw(g);
			}
		}
		
		//session.stati.drawTime+=(getTimer()-st4);
		
		//统计
		session.stati.renderedFaceCount+=aSortedFace.length;
		//--session.stati.faceCount+=faceCount;
		//--session.stati.vertexCount+=_vn;
	}
}//end of class
}

////////////////////////////////////
//真正画到屏幕上,传送一次贴图
//	private function doFastDraw(mi:MaterialInfo,aSortedFace:Array,aLine:Vector.<Line3D>,session:RenderSessionData):void{
//		//逐个画三角面,注意是只画出需要画的
//		//var st4:int=getTimer();
//		g.clear();//很重要的地方，画新的一定要注意清除
//		
//		//画face
//		if(mi == null){
//			
//			g.beginFill(0x00ff00);//注意drawTriangle如果有了uvt，是不会画纯色的
//			
//			for each(var face:Face3D in aSortedFace){
//				face.drawFastColor(g);
//			}
//		}else{
//			
//			g.beginBitmapFill(mi.bmd);
//			
//			for each(var face:Face3D in aSortedFace){
//				face.drawFastBmd(g);
//			}
//		}
//		
//		g.endFill();
//		
//		//画线
//		if(aLine!=null){
//			for each(var line:Line3D in aLine){
//				line.draw(g);
//			}
//		}
//		//T.p("facCount:"+aSortedFace.length);
//		g.endFill();
//		
//		//session.stati.drawTime+=(getTimer()-st4);
//		
//		//统计
//		session.stati.renderedFaceCount+=aSortedFace.length;
//		//--session.stati.faceCount+=faceCount;
//		//--session.stati.vertexCount+=_vn;
//	}
